home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok59.lha / AmokEd_V1.02b / txt / Printf.lzh / Printf / Printf.dok < prev    next >
Text File  |  1991-01-25  |  5KB  |  133 lines

  1. :Program.       Printf
  2. :Author.        Volker Rudolph
  3. :Address.       Lettow-Vorbeck-Str. 11 / 6750 Kaiserslautern 26
  4. :Phone.         06301/8566
  5. :Version.       1.2
  6. :Date.          7.3.90
  7. :Copyright.     PD
  8. :Language.      Assembler / Oberon
  9. :Translator.    A68k / Amiga-Oberon V1.17.1
  10. :Contents.      Allzweck-Textausgabe in Form der C-Funktion Printf
  11. :Usage.         Aufruf und Parameter wie in C
  12.  
  13. Oberon ist eine sehr gute Programmiersprache, sie hat aber auch einige
  14. Schwächen. Am meisten hat mich die aufwendige Textausgabe gestört.
  15. Allein ein einfacher Satz, wie 'Der Buchstabe A hat den ASCII-Code
  16. 65.', erfordert 6 Funktionsaufrufe.
  17.  
  18. char := 'A';
  19. io.WriteString('Der Buchstabe ');
  20. io.Write(char);
  21. io.WriteString(' hat den ASCII-Code ');
  22. io.WriteInt(ORD(char),2);
  23. io.Write('.');
  24. io.WriteLn;
  25.  
  26. In der Programmiersprache C ist das viel einfacher:
  27. printf("Der Buchstabe %c hat den ASCII-Code %d.\n",char,char);
  28.  
  29. Deshalb habe ich das Modul Printf programmiert. Da es möglichst kurz
  30. sein sollte, ist es komplett in Assembler geschrieben. Es enthält
  31. Prozeduren, die den gleichen Aufruf und die gleiche Funktion haben,
  32. wie das printf von C. Allerdings ist es in Oberon nicht wie in C
  33. möglich, eine Funktion mit variabler Anzahl von Parametern zu
  34. definieren. Deshalb gibt es 7 Funktionen: Printf0 bis Printf6. Die
  35. Zahl hinter dem Printf entspricht der Anzahl der Parameter, die die
  36. Funktion erwartet. Die Parameter sind alle von Typ LONGINT, da man die
  37. meisten Variablen-Typen in LONGINT umwandeln kann.
  38.  
  39. Der Funktionsaufruf von Printf2 würde lauten:
  40.  
  41. Printf2("Der Buchstabe %lc hat den ASCII-Code %ld.\n", ORD(char),
  42. ORD(char));
  43.  
  44. Die Format-Elemente (%s %ld etc.) haben das Format:
  45.  
  46. %[flags][breite.limit]typ
  47.  
  48. flags   : Es gibt nur das Flag '-'. Es bedeutet, daß das Argument in
  49.           seinem Feld nach links ausgerichtet wird.
  50. breite  : Minimale Feldbreite. Das Feld wird normalerweise mit Blanks
  51.           aufgefüllt. Beginnt die Feldbreite mit einer 0, so wird mit
  52.           '0' aufgefüllt.
  53. limit   : Maximale Anzahl von Zeichen, die bei einem String ausgegeben
  54.           werden.
  55. typ     : ld : Dezimal
  56.           lx : Hexadezimal
  57.           lc : Zeichen
  58.            s : String
  59.  
  60.  
  61. Printf importiert kein weiteres Modul. Als Default werden die Texte
  62. zur Standardausgabe (Dos.Ouput()) geschrieben. Falls man eine andere
  63. Ausgabe bevorzugt, kann man aber der Prozedur-Variablen 'writeProc'
  64. eine beliebige Prozedur vom Typ 'WriteProcType' zuweisen. Das ist zu
  65. empfehlen, wenn das Programm auch von der Workbench aus gestartet
  66. werden kann. Man sollte dann writeProc die Prozedur io.WriteString
  67. zuweisen, da ohne io kein Ausgabefenster geöffnet wird. Der gesamte
  68. Ausgabestring sollte nicht länger als 'bufSize' (120) Zeichen sein.
  69. überzählige Zeichen werden abgeschnitten.
  70.  
  71. Einige Beispiele:
  72.  
  73.   p.Printf0("\[0;33;40m RED \[0;31;40m WHITE\n");
  74.   RED wird in rot und WHITE in weiß ausgegeben (bei normaler Farbeinstellung)
  75.  
  76.   Die oben benutzte Kontroll-Sequenz hat das Format: "\[<style>;<fg>;<bg>m"
  77.   Dabei lassen sich folgende Werte angeben:
  78.  
  79.     <style> =    0  plain text
  80.                  1  bold-face
  81.                  3  italic
  82.                  4  underscore
  83.                  7  inverse-video
  84.  
  85.     <fg>    =    30 - 37     Vordergrundfarbe 0 bis 7 (Standard : 0 bis 3)
  86.  
  87.     <bg>    =    40 - 47     Hintergrundfarbe 0 bis 7 (Standard : 0 bis 3)
  88.  
  89.   Man kann alle Kontroll-Sequenzen des Console.device benutzen.
  90.   Siehe "Rom Kernel Reference Manual:Libraries and Devices"
  91.  
  92.   string := "Teststring";
  93.   p.Printf2("Der String %6.8s ist %ld Zeichen lang.\n",
  94.             sys.ADR(string),str.Length(string));
  95.   >>Der String TestStri ist 10 Zeichen lang.
  96.                12345678
  97.  
  98.   string := "Test";
  99.   p.Printf2("Der String %6.8s ist %ld Zeichen lang.\n",
  100.             sys.ADR(string),str.Length(string));
  101.   >>Der String   Test ist 4 Zeichen lang.
  102.                123456
  103.  
  104.   p.Printf2("Dezimal %3ld = Hex %04lx.\n",123H,123H);
  105.   >>Dezimal 291 = Hex 0123.
  106.  
  107. Falls man einen String nicht direkt ausgeben will, sondern z.B. als
  108. Parameter für einen Prozedur-Aufruf braucht, kann man anstelle von
  109. Printfx die Prozeduren SPrintfx benutzen. Sie geben die Strings nicht
  110. aus, sondern schreiben sie in einen Puffer, der mit übergeben wird.
  111. Das ist auch praktisch, wenn der Ausgabestring länger als 120 Zeichen
  112. ist.
  113.  
  114. Beispiel:
  115.              .
  116.              .
  117.              .
  118. IMPORT d:Dos,sys:SYSTEM,p:Printf;
  119.  
  120. VAR
  121.   name:ARRAY 20 OF CHAR;
  122.   buffer:ARRAY 80 OF CHAR;
  123.   handle:d.FileHandlePtr;
  124. BEGIN
  125.   name := "Printf";
  126.   p.SPrintf1(buffer,"DH0:Oberon/TXT/%s.mod",sys.ADR(name));
  127.   handle := d.Open(buffer,d.newFile);
  128.              .
  129.              .
  130.              .
  131.  
  132.   Das Programmstück öffnet die Datei "DH0:Oberon/TXT/Printf.mod"
  133.